package com.qianli.cashmama.product.server.service;

import com.qianli.cashmama.product.facade.enums.ProductShelfTypeEnum;
import com.qianli.cashmama.product.facade.result.ConfigResource;
import com.qianli.cashmama.product.facade.result.Product;
import com.qianli.cashmama.product.facade.result.ProductCategory;
import com.qianli.cashmama.product.server.domain.ProductCategoryDomain;
import com.qianli.cashmama.product.server.domain.ProductDomain;
import com.qianli.cashmama.product.server.domain.UserAuthTypeDomain;

import java.math.BigDecimal;
import java.util.List;

/**
 * Created by xuyang on 2017/7/18.
 */
public interface ProductService {

    /**
     * 根据app的编码获取产品类目列表
     *
     * @param appCode app的编码
     * @return
     */
    List<ProductCategoryDomain> getProductCategoryList(String appCode);

    /**
     * 获取所有认证信息
     */
    List<UserAuthTypeDomain> getAllUserAuth();

    /**
     * 根据产品类目编码获取产品列表，不包含产品规则
     *
     * @param productCategoryCode 产品类目编码
     * @param selectRules         true product中包含规则, false product中不包含规则
     * @param selectNotSell       true 列表中包含 product.isSelling = 0 的元素
     * @return
     */
    List<ProductDomain> getProductList(String productCategoryCode, boolean selectRules, boolean selectNotSell, ProductShelfTypeEnum shelfTypeEnum);

    /**
     * 根据产品编码获取产品详情，不包含产品规则
     *
     * @param productCode   产品类目编码
     * @param selectRules   true product中包含规则, false product中不包含规则
     * @param selectNotSell true 列表中包含 product.isSelling = 0 的元素
     * @return 如果产品被删除，产品类目被删除，selectNotSell = false 并且 产品或者类目已经下架 Product = null
     */
    ProductDomain getProductDetail(String productCode, boolean selectRules, boolean selectNotSell);

    /**
     * 根据产品类目、本金、期数获取产品信息
     *
     * @param categoryCode
     * @param principalMoney
     * @param period
     * @return
     */
    ProductDomain getProductDetail(String categoryCode, BigDecimal principalMoney, Integer period);

    ProductDomain getProductDetailByMerchantCode(String merchantCode, BigDecimal principalMoney, Integer period);

    /**
     * 获取所有可用的产品类目
     *
     * @return
     */
    List<ProductCategory> getAllActiveProductCategory();

    /**
     * @param productCategoryCode
     * @return
     */
    ProductCategory getCategoryByCode(String productCategoryCode);

    /**
     * 根据code获取数据字典name
     */
    String getDictName(String code);

    List<ConfigResource> getResource(String code);

    List<ProductCategory> getProductCategoriesByMerchantCode(String merchantCode);

    List<Product> getProductByMerchantCode(String merchantCode);
    /**
     * 根据产品类目、到账金额、期数获取产品信息
     * @param categoryCode
     * @param arrivalMoney
     * @param period
     * @return
     */
    ProductDomain getProductDetailByArrivalMoney(String categoryCode, BigDecimal arrivalMoney, Integer period, Integer type);


    boolean updateProductCategory(ProductCategory productCategory);

    void addNewProductCategory(ProductCategory productCategory);
}
